/* -*- mode: c++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- */

#ifndef _LOG_H_
#define _LOG_H_

#include <string>
#include <stdio.h>

#include <threadhelper.h>
#include <timeseq.h>

#include <string>

class Log {
public:
    std::string                 base_name;

    std::string                 dir;

    bool                        multi_thread_p;

    bool                        multi_file_p;

    /* 不要时间戳，这样，当 log 的 size 达到最大限定值的时间，改名就要
     * 加上时间戳。如果是多个程序要同时写入到一个日志文件中，会用到这
     * 种情况，这样模块不记录日志开始与结束行。 */
    bool                        no_time_suffix_p;

    bool                        stop_log;

    int                         max_size;

    std::string                 fn;

    FILE*                       fp;

    mutex_t                     write_mutex;

    TimeSeq                     time_seq;

    /* 去掉重复行 */
    std::string                 last_line;

    int                         repeat_cnt;

    bool                        remove_repeat;

    bool                        with_pid_p;

    Log(const char *bn);

    ~Log();

    int print(const char *fmt, ...) __attribute__((format(printf, 2, 3)));

    int print(const std::string& str);

    // internal usage
    int put_string(const char *str);

    // setting attributes
    void set_base_name(const char *s) { base_name = s; }

    void set_dir(const char *s) { dir = s; }

    void set_multi_thread(bool f) { multi_thread_p = f; }

    void set_multi_file(bool f) { multi_file_p = f; }

    void set_no_time_suffix(bool f) { no_time_suffix_p = f; }

    void set_max_size(int ms) { max_size = ms; }

    void set_remove_repeat(bool f) { remove_repeat = f; }

    void set_with_pid(bool f) { with_pid_p = f; }

protected:
    bool beg_write();

    bool end_write();
};

extern Log *log_get();

extern int log_print(const char *fmt, ...)
    __attribute__((format(printf, 1, 2)));

extern int log_print(const std::string& str);

extern int log_close();

extern int log_get_fn(std::string& s);

#endif /* _LOG_H_ */
